#include "ThreadPool.h"
#include <chrono>

void fun(ThreadPool & pool, int arg)
{
     for (int i = 0; i < 3; i++)
        {
            auto thdId = std::this_thread::get_id();
            pool.AddTask([&](){
                cout << "同步层线程" << arg << " 的线程ID：" << thdId << endl;
            });
        }
}

int main(int argc, char const *argv[])
{
    ThreadPool pool(2);//创建对象，创建并启动两个线程，线程内容为两个变量控制的死循环

    std::thread thd1(fun, std::ref(pool), 1);//创建线程向pool 中 添加任务
    std::thread thd2(fun, std::ref(pool), 2);
    // std::thread thd3(fun, std::ref(pool), 3);

    std::this_thread::sleep_for(std::chrono::seconds(2));
    // getchar();
    pool.Stop();

    thd1.join();
    thd2.join();
    // thd3.join();
    return 0;
}

/**
 * @brief 使用C++11 的线程、条件变量、互斥量、原子变量 可以实现一个轻巧的线程池，从而避免频繁地创建线程。使用线程池要注意一些问题：
    * 保证线程池中的任务不能挂死，否则会耗尽线程池中的线程，造成假死现象
    * 还要避免长时间去执行一个任务，会导致后面的任务大量堆积而得不到及时处理，对于耗时较长的任务可以考虑用单独的线程去处理
 * 
 */
